package com.tom.architect.party3.day28;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;

import com.tom.architect.BuildConfig;
import com.tom.architect.R;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


// 断点下载
public class MainActivity28 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main28);


        String url = "https://d.toutiao.com/K1bm?apk=1";
        OkHttpManager okHttpManager = OkHttpManager.getManager();
        Call call = okHttpManager.asyncCall(url);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("TAG", "onResponse: ");

                // 不断读写文件。
                InputStream inputStream = response.body().byteStream();
                File file = new File(getCacheDir(), "abc.apk");
                OutputStream outputStream = new FileOutputStream(file);
                int len = 0;
                byte[] buffer = new byte[1024 * 10];

                while ((len = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, len);
                    Log.e("TAG", "downlaod: "+ len);
                }
                inputStream.close();
                outputStream.close();

                // 下载成功后，安装apk
                installFile(file.getAbsolutePath());
            }
        });
    }

    private void installFile(String filePath) {
        Log.e("TAG", "installFile: "+ filePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        File apkFile = new File(filePath);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", apkFile);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        }
        startActivity(intent);
    }

    private void installFile(File  file) {
        // 核心是下面几句代码
        Intent intent = new Intent(Intent.ACTION_VIEW);
        //判断是否是AndroidN以及更高的版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileProvider", file);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        startActivity(intent);
    }

}

/**
 * 断点续传，逻辑时啥。
 * 如果下载终止(网络断开，下载停止)，下次进来接着从上次的地方开始下载。
 * 多线程：每个负责0~1Mb。多线程读后台文件，每个线程只负责读取单独的内容。
 * 文件更新：1.跳转浏览器更新apk；2.直接下载不断点下载，不多线程(OkHttp)；3.多线程；4.多线程加断点。
 * <p>
 * 专门下载apk的软件：多线程+断点，最多只能同时下载几个文件，一些暂停，一些准备下载。参考okhttp Dispatch 的逻辑
 */

